Точная нарезка материала
Эту задачу описали на форуме owen.ru.
Процитирую:
- На валу двигателя транспорта подачи материала установлен энкодер с разрешением 500 имп/об
 - Частота вращения двигателя - максимум 3000 об/мин (обычно 2000 об/мин)
 - Двигатель работает от частотника
 - Время, достаточное для подачи нужного количества материала ~0.4-0.6 сек за цикл
 - Энкодер подключен к счетчику, который управляет частотником двигателя
 - Двигатель низкоинерционный, остальная механика транспорта тоже. Останов происходит практически мгновенно, переезды есть, но они не критичны и их можно попытаться компенсировать программно.
 
От данного счетчика требуется отсчитать нужное количество импульсов и остановить двигатель. В следующем цикле счетчик должен быть обнулен до старта двигателя (переменная total в Вашем примере).
Т.е. счетчик должен уверенно и без пропусков считывать от одной фазы энкодера сигнал частотой до 30 кГц.
Если у вас открыта среда Hardella IDE, то можете либо
открыть код примера в среде, либо создать свой проект на основе примера (File > New > Project > Material cutter).
Решение
Создадим тип-перечисление для того, чтобы описывать текущее состояние системы (это делается правой кнопкой, New > c.g.v.iec66131.types > type alias):

Опишем нужную логику на языке ST:

Здесь более-менее прозрачно: выполняем то или иное действие в зависимости от текущего состояния.
Если движение закончено (текущее состояние STOP), то ждём пропадания enable для запуска нового движения.
В начальном состоянии INIT ждём когда установится нужная длина (runLength) и придёт сигнал на запуск (enable)
При движении считаем общий пробег в переменной offset и останавливаемся, если нужная длина пройдена.

В PRU программе всго 3 строки:
- В первой вызывается блок ABZ энкодера для вычисления его положения
 - Во второй строке вызываем блок нарезчика. В качестве параметра 
cntrпередаётся значение счётчика импульсов на 4-ом входе. - Сигнал на включение мотора (
cutter.out) выдаётся на 3-ый выход (out3). 
Комментировать